package com.example.tasktable.javafx;

import cn.hutool.core.date.DateUtil;
import com.example.tasktable.entity.task_table;
import com.example.tasktable.mapper.task_table_mapper;
import com.example.tasktable.util.GetMatterDataUtil;
import com.example.tasktable.util.SqlSessionUtil;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.apache.ibatis.session.SqlSession;

import java.util.Optional;

public class Window extends Application {
    public static void main(String[] args) {
        launch(args); // 启动JavaFX应用
    }

    @Override
    public void start(Stage stage) throws Exception {
        // 创建标题标签
        Label titleLabel = new Label("工作事件记录本");
        titleLabel.setStyle("-fx-font-size: 30px; -fx-padding: 20px 0px; -fx-text-fill: #333;");

        // 创建输入框和提交按钮
        TextField textField = new TextField();
        Button sendButton = new Button("提交");

        // 设置输入框样式
        textField.setStyle("-fx-padding: 10px; -fx-border-color: #ccc; -fx-border-radius: 5px;-fx-min-width: 300px");

        // 设置按钮样式
        sendButton.setStyle("-fx-padding: 10px 40px; -fx-background-color: #4CAF50; -fx-text-fill: white; -fx-border-radius: 5px;");

        // 创建消息标签，用于显示操作反馈
        Label messageLabel = new Label(null);
        messageLabel.setStyle("-fx-text-fill: red;");

        // 创建表格视图，用于显示事件记录
        TableView<Object> objectTableView = new TableView<>();
        objectTableView.setStyle("-fx-border-color: #ccc; -fx-border-radius: 5px; -fx-min-width: 500px;");

        // 创建表格列
        TableColumn<Object, Object> idColumn = new TableColumn<>("序号");
        TableColumn<Object, Object> matterColumn = new TableColumn<>("你干了什么");
        TableColumn<Object, Object> dateColumn = new TableColumn<>("日期");
        TableColumn<Object, Void> deleteColumn = new TableColumn<>("删除");

        // 设置每一列的数据源
        idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
        matterColumn.setCellValueFactory(new PropertyValueFactory<>("matter"));
        dateColumn.setCellValueFactory(new PropertyValueFactory<>("date"));


        // 添加删除按钮列
        deleteColumn.setCellFactory(param -> new TableCell<Object, Void>() {
            private final Button deleteButton = new Button("删除");

            {
                deleteButton.setStyle("-fx-background-color: #e74c3c; " + /* 稍微柔和的红色 */
                        "-fx-text-fill: white; " +
                        "-fx-font-weight: bold; " +
                        "-fx-font-size: 12px; " +
                        "-fx-padding: 5px 10px; " + /* 上下5像素，左右10像素的内边距 */
                        "-fx-border-radius: 5px; " + /* 圆角 */
                        "-fx-background-radius: 5px; ");/* 确保背景也有圆角 */
                deleteButton.setOnAction(event -> {
                    // 列删除执行逻辑
                    task_table task_table = (com.example.tasktable.entity.task_table) getTableRow().getItem();
                    // 删除确认框
                    Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
                    alert.setTitle("确认");
                    alert.setHeaderText("确认操作");
                    alert.setContentText("您确定要删除：【" + task_table.getMatter() + "】这件事情嘛？");
                    // 显示确认框并等待用户选择
                    Optional<ButtonType> result = alert.showAndWait();

                    if (result.isPresent() && result.get() == ButtonType.OK) {
                        try {
                            SqlSession sqlSession = SqlSessionUtil.GetSession();
                            task_table_mapper mapper = sqlSession.getMapper(task_table_mapper.class);
                            int i = mapper.DeleteMatter(task_table.getId());
                            if (i >= 1) {
                                textField.clear();
                                // 刷新数据，在新的线程中运行
                                Platform.runLater(() -> {
                                    objectTableView.getItems().clear();
                                    objectTableView.getItems().addAll(GetMatterDataUtil.GetData());
                                    objectTableView.getSortOrder().add(dateColumn); // 添加到排序顺序
                                    objectTableView.sort(); // 执行排序
                                });
                                sqlSession.commit();
                                sqlSession.close();
                            } else {
                                // 插入失败，显示错误消息
                                Alert alert2 = new Alert(Alert.AlertType.ERROR);
                                alert.setTitle("错误");
                                alert.setHeaderText("数据库连接失败");
                                alert.setContentText("请检查数据库设置或连接。");
                                alert.showAndWait();
                                System.exit(0);
                            }
                        } catch (Exception e) {
                            // 捕获异常并显示错误消息
                            Alert alert2 = new Alert(Alert.AlertType.ERROR);
                            alert2.setTitle("错误");
                            alert2.setHeaderText("数据库连接失败");
                            alert2.setContentText("请检查数据库设置或连接。错误信息: " + e.getMessage());
                            alert2.showAndWait();
                            System.exit(0);
                        }
                    }
                });
            }

            @Override
            protected void updateItem(Void item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setGraphic(null);
                } else {
                    setGraphic(deleteButton);
                    setAlignment(Pos.CENTER); // 居中显示
                }
            }

        });

        // 设置列的对齐方式
        idColumn.setStyle("-fx-alignment: CENTER");
        matterColumn.setStyle("-fx-alignment: CENTER");
        dateColumn.setStyle("-fx-alignment: CENTER");
        // 设置列的宽度
        matterColumn.setPrefWidth(250);

        // 将列添加到表格
        objectTableView.getColumns().addAll(idColumn, matterColumn, dateColumn, deleteColumn);

        // 初始化表格数据
        objectTableView.getItems().addAll(GetMatterDataUtil.GetData());

        // 设置降序排序
        dateColumn.setSortType(TableColumn.SortType.DESCENDING);
        objectTableView.getSortOrder().add(dateColumn);
        objectTableView.sort(); // 执行排序

        // 创建删除按钮
        Button DROPButton = new Button("删除全部数据");
        HBox DROPButtonHBOX = new HBox(DROPButton);
        DROPButtonHBOX.setAlignment(Pos.CENTER);
        DROPButtonHBOX.setStyle("-fx-padding: 10px 40px; -fx-button-color: #4CAF50; -fx-text-fill: white; -fx-border-radius: 5px;");

        // 创建水平布局
        HBox titleBox = new HBox(titleLabel);
        titleBox.setAlignment(Pos.TOP_CENTER);

        HBox inputBox = new HBox(textField, sendButton);
        inputBox.setAlignment(Pos.TOP_CENTER);
        inputBox.setSpacing(10); // 设置输入框和按钮之间的间距

        HBox messageBox = new HBox(messageLabel);
        messageBox.setAlignment(Pos.TOP_CENTER);
        messageBox.setStyle("-fx-padding: 20px 0px");

        HBox objectTableViewBox = new HBox(objectTableView);

        objectTableViewBox.setAlignment(Pos.CENTER);
        objectTableViewBox.setStyle("-fx-padding: 10px 0px");

        // 创建垂直布局，并添加所有元素
        VBox mainLayout = new VBox();
        mainLayout.getChildren().addAll(titleBox, inputBox, messageBox, objectTableViewBox, DROPButtonHBOX);
        mainLayout.setStyle("-fx-padding: 20px; -fx-background-color: #f9f9f9;");

        // 设置场景和边框
        Scene scene = new Scene(mainLayout, 560, 700);
        stage.setScene(scene);
        stage.setTitle("工作事件记录本");
        stage.show();

        // 逻辑部分：设置提交按钮的事件处理
        sendButton.setOnAction(e -> {
            // 检查输入框是否为空
            if (textField.getText().isEmpty()) {
                messageLabel.setText("你写点东西呢？"); // 提示用户输入内容
            } else {
                try {
                    // 获取数据库会话
                    SqlSession sqlSession = SqlSessionUtil.GetSession();
                    task_table_mapper mapper = sqlSession.getMapper(task_table_mapper.class);
                    // 执行插入操作
                    int i = mapper.insertData(textField.getText(), DateUtil.now());
                    if (i >= 1) {
                        messageLabel.setText("哇！你好棒！"); // 插入成功消息
                        textField.clear();
                        // 刷新数据，在新的线程中运行
                        Platform.runLater(() -> {
                            objectTableView.getItems().clear();
                            objectTableView.getItems().addAll(GetMatterDataUtil.GetData());
                            objectTableView.getSortOrder().add(dateColumn); // 添加到排序顺序
                            objectTableView.sort(); // 执行排序
                        });
                    } else {
                        // 插入失败，显示错误消息
                        Alert alert = new Alert(Alert.AlertType.ERROR);
                        alert.setTitle("错误");
                        alert.setHeaderText("数据库连接失败");
                        alert.setContentText("请检查数据库设置或连接。");
                        alert.showAndWait();
                        System.exit(0);
                    }
                    sqlSession.commit(); // 提交事务
                    sqlSession.close(); // 关闭会话
                } catch (Exception error) {
                    // 捕获异常并显示错误消息
                    Alert alert = new Alert(Alert.AlertType.ERROR);
                    alert.setTitle("错误");
                    alert.setHeaderText("数据库连接失败");
                    alert.setContentText("请检查数据库设置或连接。错误信息: " + error.getMessage());
                    alert.showAndWait();
                    System.exit(0);
                }
            }
        });

        // 删除按钮的事件处理
        DROPButton.setOnAction(e -> {
            // 删除确认框
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.setTitle("确认");
            alert.setHeaderText("确认操作");
            alert.setContentText("您确定要继续吗？");

            // 显示确认框并等待用户选择
            Optional<ButtonType> result = alert.showAndWait();

            if (result.isPresent() && result.get() == ButtonType.OK) {
                try {
                    SqlSession sqlSession = SqlSessionUtil.GetSession();
                    task_table_mapper mapper = sqlSession.getMapper(task_table_mapper.class);
                    if (mapper.DeleteAll() <= 1) {
                        sqlSession.commit(); // 提交事务
                        textField.clear();
                        // 刷新数据，在新的线程中运行
                        Platform.runLater(() -> {
                            objectTableView.getItems().clear();
                            objectTableView.getItems().addAll(GetMatterDataUtil.GetData());
                            objectTableView.getSortOrder().add(dateColumn); // 添加到排序顺序
                            objectTableView.sort(); // 执行排序
                        });
                        // 提示
                        Alert alert1 = new Alert(Alert.AlertType.INFORMATION);
                        alert1.setTitle("提示");
                        alert1.setHeaderText("数据库已删除");
                        alert1.showAndWait();
                        sqlSession.close();
                    } else {
                        // 删除失败，显示错误消息
                        Alert alert2 = new Alert(Alert.AlertType.ERROR);
                        alert2.setTitle("错误");
                        alert2.setHeaderText("删除失败");
                        alert2.setContentText("请检查数据库设置或连接。");
                        alert2.showAndWait();
                    }
                    sqlSession.close();
                } catch (Exception error) {
                    // 捕获异常并显示错误消息
                    Alert alert3 = new Alert(Alert.AlertType.ERROR);
                    alert3.setTitle("错误");
                    alert3.setHeaderText("删除失败");
                    alert3.setContentText("请检查数据库设置或连接。错误信息: " + error.getMessage());
                    alert3.showAndWait();
                }
            }
        });

        // 双击事件：复制内容到剪贴板
        objectTableView.setOnMouseClicked(event -> {
            if (event.getClickCount() == 2) { // 检查双击事件
                TablePosition<?, ?> pos = objectTableView.getSelectionModel().getSelectedCells().get(0);
                int row = pos.getRow();
                int col = pos.getColumn();

                // 获取对应的行数据
                Object item = objectTableView.getItems().get(row);

                // 假设 item 是 task_table 类型
                if (item instanceof task_table) {
                    task_table task = (task_table) item;
                    String content = "";
                    if (col == 0) {
                        content = String.valueOf(task.getId());
                    } else if (col == 1) {
                        content = task.getMatter();
                    } else if (col == 2) {
                        content = task.getDate();
                    }

                    // 提示用户已复制内容
                    Alert alert1 = new Alert(Alert.AlertType.INFORMATION);
                    alert1.setTitle("提示");
                    alert1.setHeaderText("内容已复制！");
                    alert1.setContentText("复制的内容：" + content);
                    alert1.showAndWait();

                    // 复制到剪贴板
                    Clipboard clipboard = Clipboard.getSystemClipboard();
                    ClipboardContent clipboardContent = new ClipboardContent();
                    clipboardContent.putString(content);
                    clipboard.setContent(clipboardContent);
                }
            }
        });
    }
}